Trim the dataset
Remove outliers
Some species are lost in the trimmed dataset
Remove samples at present (or with negative age)
FALSE TRUE
512259 682
Reverse negative uncertainty ranges
2 species have a speciation date of 0.0. Change it to the oldest
fossil age.
[1] "Berggrenia pumilio" "Globigerinita minuta"
[1] "species" "rowID" "orig.species" "abundance" "orig.abundance" "abun.units" "sample.depth" "segment"
[9] "age" "age.err" "age.calc" "zone" "zon.age" "age.st" "age.en" "rng.age"
[17] "int.age" "err.int.age" "mag.zone" "mag.age.st" "mag.age.en" "mag.age" "int.mag.age" "err.int.mag.age"
[25] "mod.age" "r2" "n.pts" "age.model" "AM.type" "latitude" "longitude" "pal.lat"
[33] "pal.long" "water.depth" "db.source" "dbID" "holeID" "sampleID" "reason" "leg"
[41] "site" "hole" "core" "section" "sample.top" "sample.type" "total.IDd" "preservation"
[49] "processing" "person" "date" "year" "source" "num.ind" "rel.abun" "round.age"
[57] "round.lat" "round.pal.lat" "Macro/micro" "orig.st" "orig.en" "Zone.st" "Zone.en" "Zone.st.ref"
[65] "Zone.en.ref" "orig.ts" "St.Date.reference" "En.Date.reference" "Speciation" "Extinction" "trim"
Check the repartition through time
Full fossil record
Each occurrence is associated with a stratigraphic age
uncertainty interval (minimum and maximum ages).




Add age uncertainty to avoid occurrences with the same age
Many occurrences have the exact same age.
0.01 0.02 0.04 0.03 0.12
16549 6556 4914 4702 4070
In order to avoid clusters let’s draw them uniformly in their
interval rather than taking the midpoint (for the “Zone” and “Magneto”
methods).
For other methods, simply add 10000 yrs uncertainty around age
estimates, reflecting uniformisation in the sedimentation process.
8.91956830861745e-07 4.58073036833413e-06 5.62783745405112e-05 7.45228141946788e-05 9.40664828176489e-05
1 1 1 1 1
The issue is now solved.

Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
Please use the `linewidth` argument instead.



Check the repartition of occurrences per species
Globigerina bulloides Globigerinita glutinata Neogloboquadrina pachyderma Orbulina universa Neogloboquadrina incompta
18558 18522 15570 14855 13564
Globigerinoides ruber Globoconella inflata Turborotalita quinqueloba Hirsutella scitula Trilobatus sacculifer
13414 12248 11668 11341 10648
Some species have much more occurrences than others. Let’s compare
the distribution of number of occurrences in Triton compared to a
Poisson sampling over the species lifetime.


The expected distribution is more unequal: the rarest species have
fewer occurrences, the median species has around 100 occurrences, for
nearly 250 in Triton.
Save database
Warning: cannot open file '../Triton_processed/TritonDB_trimmed_runif.csv': No such file or directoryError in file(file, ifelse(append, "a", "w")) :
cannot open the connection
LS0tCnRpdGxlOiAiQ2xlYW4gdGhlIHJhdyBUcml0b24gZGF0YWJhc2UiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImdncGxvdDIiKQpsaWJyYXJ5KCJhcGUiKQpgYGAKCmBgYHtyfQojIExvYWQgb2NjdXJyZW5jZSBkYXRhc2V0CmxvYWQoIi4uLy4uLzEtRGF0YV9yYXcvVHJpdG9uREIvdHJpdG9uLlJEYXRhIikKYGBgCgojIFRyaW0gdGhlIGRhdGFzZXQKIyMgUmVtb3ZlIG91dGxpZXJzCgpgYGB7cn0KIyBXb3JrIG9uIHRoZSB0cmltbWVkIGRhdGFzZXQsIHdoaWNoIGV4Y2x1ZGVzIG9jY3VycmVuY2VzIHRoYXQgZmFsbCBzaWduaWZpY2FudGx5IG91dHNpZGUgdGhlIGtub3duIHJhbmdlIG9mIHRoZSBzcGVjaWVzLiBUaGUgY3V0LW9mZiBmb3IgdGhlIE5lb2dlbmUgaXMgMk1hIG91dHNpZGUgdGhlIHNwZWNpZXMga25vd24gcmFuZ2UsIGFuZCA1TWEgZm9yIHRoZSBQYWxhZW9nZW5lIChjZi4gRmVudG9uIGV0IGFsLiAyMDIxKS4KdHJpdG9uIDwtIHRyaXRvbi5wcmVzW3RyaXRvbi5wcmVzJHRyaW0gPT0gImluYyIsXQpgYGAKClNvbWUgc3BlY2llcyBhcmUgbG9zdCBpbiB0aGUgdHJpbW1lZCBkYXRhc2V0CgpgYGB7cn0Kc3BlY2llc19sb3N0IDwtIHVuaXF1ZSh0cml0b24ucHJlcyRzcGVjaWVzKVshKHVuaXF1ZSh0cml0b24ucHJlcyRzcGVjaWVzKSAlaW4lIHVuaXF1ZSh0cml0b24kc3BlY2llcykpXQp0cml0b24ucHJlc1t0cml0b24ucHJlcyRzcGVjaWVzICVpbiUgc3BlY2llc19sb3N0LF0KYGBgCgojIyBSZW1vdmUgc2FtcGxlcyBhdCBwcmVzZW50IChvciB3aXRoIG5lZ2F0aXZlIGFnZSkKCmBgYHtyfQojIFNvbWUgc2FtcGxlcyBoYXZlIGEgbmVnYXRpdmUgYWdlCnRhYmxlKHRyaXRvbi5wcmVzJGFnZTwwKQpgYGAKCmBgYHtyfQojIEtlZXAgb25seSBwYXN0IG9jY3VycmVuY2VzCnRyaXRvbiA8LSB0cml0b25bdHJpdG9uJGFnZSA+IDAsXQpgYGAKCiMjIFJldmVyc2UgbmVnYXRpdmUgdW5jZXJ0YWludHkgcmFuZ2VzCgpgYGB7cn0KZGF0YS5mcmFtZShwb3NpdGl2ZSA9IHN1bSh0cml0b24kcm5nLmFnZSA+IDAsIG5hLnJtPVQpLCAKICAgICAgICAgICBudWxsID0gc3VtKHRyaXRvbiRybmcuYWdlID09IDAsIG5hLnJtPVQpLCAKICAgICAgICAgICBuZWdhdGl2ZSA9IHN1bSh0cml0b24kcm5nLmFnZSA8IDAsIG5hLnJtPVQpKQojdHJpdG9uIDwtIHRyaXRvbltzYXBwbHkodHJpdG9uJHJuZy5hZ2UgPiAwLCBmdW5jdGlvbih4KSBpZmVsc2UoaXMubmEoeCksIEYsIHgpKSxdCmFnZS5taW4gPC0gYXBwbHkodHJpdG9uWyxjKCJhZ2UuZW4iLCAiYWdlLnN0IildLCAxLCBtaW4pCmFnZS5tYXggPC0gYXBwbHkodHJpdG9uWyxjKCJhZ2UuZW4iLCAiYWdlLnN0IildLCAxLCBtYXgpCnRyaXRvbiRhZ2UuZW4gPC0gYWdlLm1pbgp0cml0b24kYWdlLnN0IDwtIGFnZS5tYXgKdHJpdG9uJHJuZy5hZ2UgPC0gdHJpdG9uJGFnZS5zdCAtIHRyaXRvbiRhZ2UuZW4KYGBgCgojIyAyIHNwZWNpZXMgaGF2ZSBhIHNwZWNpYXRpb24gZGF0ZSBvZiAwLjAuIENoYW5nZSBpdCB0byB0aGUgb2xkZXN0IGZvc3NpbCBhZ2UuCgpgYGB7cn0KdW5pcXVlKHRyaXRvblt0cml0b24kU3BlY2lhdGlvbj09MCxdJHNwZWNpZXMpCnRyaXRvblt0cml0b24kc3BlY2llcz09IkJlcmdncmVuaWEgcHVtaWxpbyIsXSRTcGVjaWF0aW9uIDwtIG1heCh0cml0b25bdHJpdG9uJHNwZWNpZXM9PSJCZXJnZ3JlbmlhIHB1bWlsaW8iLF0kYWdlKQp0cml0b25bdHJpdG9uJHNwZWNpZXM9PSJHbG9iaWdlcmluaXRhIG1pbnV0YSIsXSRTcGVjaWF0aW9uIDwtIG1heCh0cml0b25bdHJpdG9uJHNwZWNpZXM9PSJHbG9iaWdlcmluaXRhIG1pbnV0YSIsXSRhZ2UpCmBgYAoKYGBge3J9Cm5hbWVzKHRyaXRvbikKYGBgCiMgQ2hlY2sgdGhlIHJlcGFydGl0aW9uIHRocm91Z2ggdGltZQojIyBGdWxsIGZvc3NpbCByZWNvcmQKCkVhY2ggb2NjdXJyZW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggYSAqKnN0cmF0aWdyYXBoaWMgYWdlIHVuY2VydGFpbnR5IGludGVydmFsKiogKG1pbmltdW0gYW5kIG1heGltdW0gYWdlcykuCgpgYGB7ciwgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xNX0KZ2dwbG90KHRyaXRvblshaXMubmEodHJpdG9uJHJuZy5hZ2UpLF0pICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAtYWdlLnN0LCB5ID0gLWFnZSwgeGVuZCA9IC1hZ2UuZW4sIHllbmQ9LWFnZSwgY29sb3I9LWFnZSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShuYW1lID0gIk9jY3VycmVuY2VzIikgKwogIGxhYnMoY29sb3VyPSJNZWFuIGFnZSIpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2YgYWdlIGludGVydmFscywgZGVwZW5kaW5nIG9uIHRoZSBhZ2UgY2FsY3VsYXRpb24gbWV0aG9kIikgKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGZhY2V0X2dyaWQoLiB+IGFnZS5jYWxjKQpgYGAKCmBgYHtyLCBmaWcuYXNwPTAuMywgZmlnLndpZHRoPTE1fQpwIDwtIGdncGxvdCh0cml0b24sIGFlcyh4PS1hZ2UsIHk9cm5vcm0obGVuZ3RoKGFnZSksIDEsIDAuMDUpKSkgKwogIGdlb21fcG9pbnQoY2V4PTAuMDEsIGFscGhhPTAuMDUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiT2NjdXJyZW5jZXMiLCBsaW1pdHMgPSBjKDAuNywgMS4zKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGxpbmV3aWR0aCA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJUZW1wb3JhbCByZXBhcnRpdGlvbiBvZiIsIGRpbSh0cml0b24pWzFdLCAicmVjb3JkZWQgb2NjdXJyZW5jZXMgLSBNaWRwb2ludCIpKQoKcSA8LSBnZ3Bsb3QodHJpdG9uLCBhZXMoeD0tYWdlLCB5PXBhbC5sYXQpKSArCiAgZ2VvbV9wb2ludChjZXg9MC4wMSwgYWxwaGE9MC4wNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJQYWxlb2xhdGl0dWRlICjCsCkiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUobGluZXdpZHRoID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9ICJibGFjayIpKSArCiAgZ2d0aXRsZShwYXN0ZSgiU3BhdGlvLXRlbXBvcmFsIHJlcGFydGl0aW9uIG9mIiwgZGltKHRyaXRvbilbMV0sICJyZWNvcmRlZCBvY2N1cnJlbmNlcyAtIE1pZHBvaW50IikpCgpyIDwtIGdncGxvdCh0cml0b24sIGFlcyh4PS1hZ2UpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiVGltZSAoTXkpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBvY2N1cnJlbmNlcyIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IkFjY2VwdGVkIHJhbmsiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIGdndGl0bGUocGFzdGUoIkV2b2x1dGlvbiBvZiB0aGUgbnVtYmVyIG9jY3VycmVuY2VzICggdG90YWwgb2YiLCBkaW0odHJpdG9uKVsxXSwgIikiKSkKCnA7cTtyCmBgYAoKIyMgQWRkIGFnZSB1bmNlcnRhaW50eSB0byBhdm9pZCBvY2N1cnJlbmNlcyB3aXRoIHRoZSBzYW1lIGFnZQoKTWFueSBvY2N1cnJlbmNlcyBoYXZlIHRoZSBleGFjdCBzYW1lIGFnZS4KCmBgYHtyfQpoZWFkKHNvcnQodGFibGUodHJpdG9uJGFnZSksIGRlY3JlYXNpbmcgPSBUKSwgNSkKYGBgCgpJbiBvcmRlciB0byBhdm9pZCBjbHVzdGVycyBsZXQncyBkcmF3IHRoZW0gdW5pZm9ybWx5IGluIHRoZWlyIGludGVydmFsIHJhdGhlciB0aGFuIHRha2luZyB0aGUgbWlkcG9pbnQgKGZvciB0aGUgIlpvbmUiIGFuZCAiTWFnbmV0byIgbWV0aG9kcykuCgpgYGB7cn0KdHJpdG9uJGFnZV9ydW5pZiA8LSB0cml0b24kYWdlCgojIFpvbmUgbWV0aG9kCmNvbmQgPC0gdHJpdG9uJGFnZS5jYWxjID09ICJab25lIgp0cml0b25bY29uZCxdJGFnZV9ydW5pZiA8LSBhcHBseSh0cml0b25bY29uZCxdLCAxLCBmdW5jdGlvbihUcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9taW4gPC0gYXMubnVtZXJpYyhUclsiYWdlLmVuIl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX21heCA8LSBhcy5udW1lcmljKFRyWyJhZ2Uuc3QiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWdlX21heCA9PSBhZ2VfbWluKSBhZ2VfbWF4IDwtIGFnZV9tYXggKyAwLjAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChydW5pZigxLCBhZ2VfbWluLCBhZ2VfbWF4KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQojIE1hZ25ldG8gbWV0aG9kCmNvbmQgPC0gdHJpdG9uJGFnZS5jYWxjID09ICJNYWduZXRvIgp0cml0b25bY29uZCxdJGFnZV9ydW5pZiA8LSBhcHBseSh0cml0b25bY29uZCxdLCAxLCBmdW5jdGlvbihUcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9taW4gPC0gYXMubnVtZXJpYyhUclsibWFnLmFnZS5lbiJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9tYXggPC0gYXMubnVtZXJpYyhUclsibWFnLmFnZS5zdCJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZ2VfbWF4ID09IGFnZV9taW4pIGFnZV9tYXggPC0gYWdlX21heCArIDAuMDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJ1bmlmKDEsIGFnZV9taW4sIGFnZV9tYXgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCmBgYAoKRm9yIG90aGVyIG1ldGhvZHMsIHNpbXBseSBhZGQgMTAwMDAgeXJzIHVuY2VydGFpbnR5IGFyb3VuZCBhZ2UgZXN0aW1hdGVzLCByZWZsZWN0aW5nIHVuaWZvcm1pc2F0aW9uIGluIHRoZSBzZWRpbWVudGF0aW9uIHByb2Nlc3MuCgpgYGB7cn0KIyBPdGhlciBtZXRob2RzCnRpbWVfc3BhbiA8LSAwLjAxICAjIDEwMDAwIHlzID0gMC4wMSBNeXMKY29uZCA8LSB0cml0b24kYWdlLmNhbGMgIT0gIlpvbmUiICYgdHJpdG9uJGFnZS5jYWxjICE9ICJNYWduZXRvIiAmIHRyaXRvbiRTcGVjaWF0aW9uID4gdHJpdG9uJEV4dGluY3Rpb24KdHJpdG9uW2NvbmQsXSRhZ2VfcnVuaWYgPC0gYXBwbHkodHJpdG9uW2NvbmQsXSwgMSwgZnVuY3Rpb24oVHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfbWluIDwtIG1heChhcy5udW1lcmljKFRyWyJhZ2UiXSkgLSB0aW1lX3NwYW4vMiwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfbWF4IDwtIGFzLm51bWVyaWMoVHJbImFnZSJdKSArIHRpbWVfc3Bhbi8yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByaW50KGMoYXMubnVtZXJpYyhUclsiYWdlIl0pLCAxLjEqYXMubnVtZXJpYyhUclsiU3BlY2lhdGlvbiJdKSwgYWdlX21heCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChydW5pZigxLCBhZ2VfbWluLCBhZ2VfbWF4KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKI2FnZV9taW4gPC0gc2FwcGx5KHRyaXRvbltjb25kLF0kYWdlLXRpbWVfc3Bhbi8yLCBtYXgsIDApCiNhZ2VfbWF4IDwtIHRyaXRvbltjb25kLF0kYWdlK3RpbWVfc3Bhbi8yCiNtYXBwbHkocnVuaWYsIG49MSwgbWluPWFnZV9taW4sIG1heD1hZ2VfbWF4KSAtIHRyaXRvbltjb25kLF0kYWdlX3J1bmlmCmBgYAoKYGBge3J9CmhlYWQoc29ydCh0YWJsZSh0cml0b24kYWdlX3J1bmlmKSwgZGVjcmVhc2luZyA9IFQpLCA1KQpgYGAKClRoZSBpc3N1ZSBpcyBub3cgc29sdmVkLgoKYGBge3IsIGZpZy5hc3A9MC4zLCBmaWcud2lkdGg9MTV9CnAKZ2dwbG90KHRyaXRvbiwgYWVzKHg9LWFnZV9ydW5pZiwgeT1ybm9ybShsZW5ndGgoYWdlX3J1bmlmKSwgMSwgMC4wNSkpKSArCiAgZ2VvbV9wb2ludChjZXg9MC4wMSwgYWxwaGE9MC4wNSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIlRpbWUgKE15KSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJPY2N1cnJlbmNlcyIsIGxpbWl0cyA9IGMoMC43LCAxLjMpKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJBY2NlcHRlZCByYW5rIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZ3RpdGxlKHBhc3RlKCJUZW1wb3JhbCByZXBhcnRpdGlvbiBvZiIsIGRpbSh0cml0b24pWzFdLCAicmVjb3JkZWQgb2NjdXJyZW5jZXMgLSBVbmlmb3JtIGRyYXciKSkKCnEKZ2dwbG90KHRyaXRvbiwgYWVzKHg9LWFnZV9ydW5pZiwgeT1wYWwubGF0KSkgKwogIGdlb21fcG9pbnQoY2V4PTAuMDEsIGFscGhhPTAuMDUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJUaW1lIChNeSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiUGFsZW9sYXRpdHVkZSAowrApIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iQWNjZXB0ZWQgcmFuayIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3VyID0gImJsYWNrIikpICsKICBnZ3RpdGxlKHBhc3RlKCJTcGF0aW8tdGVtcG9yYWwgcmVwYXJ0aXRpb24gb2YiLCBkaW0odHJpdG9uKVsxXSwgInJlY29yZGVkIG9jY3VycmVuY2VzIC0gVW5pZm9ybSBkcmF3IikpCmBgYAoKIyBDaGVjayB0aGUgcmVwYXJ0aXRpb24gb2Ygb2NjdXJyZW5jZXMgcGVyIHNwZWNpZXMKCmBgYHtyfQpoZWFkKHNvcnQodGFibGUodHJpdG9uJHNwZWNpZXMpLCBkZWNyZWFzaW5nID0gVCksIDEwKQpgYGAKClNvbWUgc3BlY2llcyBoYXZlIG11Y2ggbW9yZSBvY2N1cnJlbmNlcyB0aGFuIG90aGVycy4gTGV0J3MgY29tcGFyZSB0aGUgZGlzdHJpYnV0aW9uIG9mIG51bWJlciBvZiBvY2N1cnJlbmNlcyBpbiBUcml0b24gY29tcGFyZWQgdG8gYSBQb2lzc29uIHNhbXBsaW5nIG92ZXIgdGhlIHNwZWNpZXMgbGlmZXRpbWUuCgpgYGB7ciwgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xMH0KZ2dwbG90KHRyaXRvbiwgYWVzKHg9cmVvcmRlcihzcGVjaWVzLCB0YWJsZShzcGVjaWVzKVtzcGVjaWVzXSkpKSArCiAgZ2VvbV9iYXIoc3RhdD0iY291bnQiLCBmaWxsPSJkYXJrZ3JlZW4iLCBjb2w9ImRhcmtncmVlbiIpICsgCiAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0gIlNwZWNpZXMgbmFtZXMiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbmFtZSA9ICJOdW1iZXIgb2YgY29ycmVzcG9uZGluZyBvY2N1cnJlbmNlcyAobG9nLXNjYWxlKSIsIGxpbWl0cz1jKDEsMTAwMDAwKSkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBnZ3RpdGxlKCJEaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBpZGVudGlmaWVkIHRvIHRoZSBzYW1lIHNwZWNpZXMiKQoKIyBTYW1wbGUgdGhlIHNhbWUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIGFzIGluIFRyaXRvbiwgYnV0IHdpdGggYSBzYW1wbGluZyBwcm9iYWJpbGl0eSBzdHJpY3RseSBwcm9wb3J0aW9uYWwgdG8gdGhlIHNwZWNpZXMgcmFuZ2UuCnRyaXRvbl9Qb2lzc29uIDwtIGRhdGEuZnJhbWUoc3BlY2llcz1zYW1wbGUodHJpdG9uJHNwZWNpZXMsIHNpemU9bnJvdyh0cml0b24pLCByZXBsYWNlPVQsIHByb2I9dHJpdG9uJFNwZWNpYXRpb24tdHJpdG9uJEV4dGluY3Rpb24pKQoKZ2dwbG90KHRyaXRvbl9Qb2lzc29uLCBhZXMoeD1yZW9yZGVyKHNwZWNpZXMsIHRhYmxlKHNwZWNpZXMpW3NwZWNpZXNdKSkpICsKICBnZW9tX2JhcihzdGF0PSJjb3VudCIsIGZpbGw9ImRhcmtncmVlbiIsIGNvbD0iZGFya2dyZWVuIikgKyAKICBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSAiU3BlY2llcyBuYW1lcyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBuYW1lID0gIk51bWJlciBvZiBjb3JyZXNwb25kaW5nIG9jY3VycmVuY2VzIChsb2ctc2NhbGUpIiwgbGltaXRzPWMoMSwxMDAwMDApKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGdndGl0bGUoIkV4cGVjdGVkIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIHVuZGVyIGEgUG9pc3NvbiBwcm9jZXNzIikKYGBgCgpgYGB7cn0KZGF0YS5mcmFtZShtZWRpYW5fdHJpdG9uID0gbWVkaWFuKHRhYmxlKHRyaXRvbiRzcGVjaWVzKSksIG1lZGlhbl9leHBlY3RlZCA9IG1lZGlhbih0YWJsZSh0cml0b25fUG9pc3NvbiRzcGVjaWVzKSkpCmBgYAoKVGhlIGV4cGVjdGVkIGRpc3RyaWJ1dGlvbiBpcyBtb3JlIHVuZXF1YWw6IHRoZSByYXJlc3Qgc3BlY2llcyBoYXZlIGZld2VyIG9jY3VycmVuY2VzLCB0aGUgbWVkaWFuIHNwZWNpZXMgaGFzIGFyb3VuZCAxMDAgb2NjdXJyZW5jZXMsIGZvciBuZWFybHkgMjUwIGluIFRyaXRvbi4KCiMgU2F2ZSBkYXRhYmFzZQoKYGBge3J9CndyaXRlLmNzdih0cml0b24sICIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL1RyaXRvbl9vY2N1cnJlbmNlcy9Ucml0b25EQl90cmltbWVkX3J1bmlmLmNzdiIpCmBgYAo=